#include "hash.h"

class Solution {
public:
    bool check(string s, int l) //滑动窗口
    {
        int k = 0, cnt[256] = { 0 }; //记录不同元素数量，以及每个元素数量
        for (int i = 0; i < s.size(); i++)
        {
            cnt[s[i]]++; 
            if (cnt[s[i]] == 1) k++;
            if (i >= l) { //说明有东西滑出
                cnt[s[i - l]]--;
                if (cnt[s[i - l]] == 0)k--; //说明窗口某个元素没有了
            }
            if (k == l) return true;
        }
        return false;
    }
    int lengthOfLongestSubstring(string s) { //二分来判断长度，给定一个假设值l，利用窗口滑动，来不断确定长度
        int head = 0, tail = s.size(), mid;
        while (head < tail)
        {
            mid = (head + tail + 1) >> 1;
            if (check(s, mid))  head = mid;
            else tail = mid - 1;
        }
        return head; //返回不重复
    }
};